/*
 * Server.h
 *
 *  Created on: 2010-05-28
 *      Author: mateusz
 */

#ifndef SERVER_H_
#define SERVER_H_

#include <ClanLib/core.h>
#include <ClanLib/network.h>

#include "ServerUser.h"
#include "ServerMap.h"
#include "ServerPlayer.h"

#include <map>

/**
 * Server gry
 */

class Server {
public:
	Server();
	virtual ~Server();

	/**
	 * Główna petla
	 */
	void exec();
private:
	/**
	 * Obsluga eventu podlaczanie sie nowego gracza
	 */
	void on_client_connected(CL_NetGameConnection *connection);

	/**
	 * Obsluga eventu rozlaczenia sie gracza
	 */
	void on_client_disconnected(CL_NetGameConnection *connection);

	/**
	 * Obslugi otrzymania od gracza eventu
	 */
	void on_event_received(CL_NetGameConnection *connection, const CL_NetGameEvent &e);

	/**
	 * Wysyla otrzymany event do pozostalych graczy
	 */
	void sendToAll(const CL_NetGameEvent &event, const ServerUser *user = NULL);

	void handlePlayerBombPlant(const CL_NetGameEvent &event);
	void handlePlayerMove(const CL_NetGameEvent &event);
	void handleDead(const CL_NetGameEvent &event);

	/**
	 * Generuje nowa mape, ozywia wszystkich i wysyla event o rozpoczeciu
	 * gry
	 */
	void restartGame();

	CL_NetGameServer network_server;
	CL_SlotContainer slots;

	ServerMap map;

	CL_NetGameEventDispatcher_v1<ServerUser*> game_events;

	std::vector<ServerUser*> connected;
	std::map<int,ServerPlayer*> players;

	int nextUserId;
	bool gameRunning;
};

#endif /* SERVER_H_ */
